iT邦幫忙

2022 iThome 鐵人賽

DAY 8
0
自我挑戰組

跟著 Go 實戰聖經 一起自學 Go系列 第 8

DAY 8 Go 語言 條件判斷 - if ... else 敘述

  • 分享至 

  • xImage
  •  

昨天我們學會了常數 (constants) 、列舉 (enums) 與變數作用範圍 (scope),今天繼續來學習寫程式一定會遇到的 if ... else 條件判斷吧!

if 敘述

if 中文就是 如果 ,而 if 敘述,直接舉例就是:「如果我中樂透頭獎,我就要環遊世界! ; 如果沒有中樂透,我就繼續努力上班吧QQ」,這句話的意思是,前半句是 true ,也就是說前半句成立(中樂透頭獎或沒中樂透),後半句才會執行(環遊世界或努力上班),而 if 敘述就是如此,以下來看看怎麼把剛剛的話,用 go 寫出來吧!

if <true的運算式> {
    <執行的程式碼>
}

範例 1:

package main

import "fmt"

const lotteryNumber int = 4516282935

func main(){
    myLotteryNumber := 4516282935
    if lotteryNumber == myLotteryNumber{
        fmt.Println("環遊世界")  // 上述條件成立,故執行這句程式碼
    }

    if lotteryNumber != myLotteryNumber{
        fmt.Println("繼續努力上班吧QQ")  // 上述條件不成立,故這句程式碼不會執行到
    }
}

範例 1(執行結果):

環遊世界

else 敘述

學會 if 敘述之後,會發現好像不太夠用誒,像是上面的例子,其實可以把兩句話和合併成一句話:「如果我中樂透頭獎,我就要環遊世界!,其他(=如果沒有中樂透),我就繼續努力上班吧QQ」,這時候我們只要加上 else 就可以輕鬆合併成一句話。

if <true的運算式> {
    <執行的程式碼>
} else {
    <執行的程式碼>
}

範例 2:

package main

import "fmt"

const lotteryNumber int = 4516282935

func main(){
    myLotteryNumber := 4516282935
    if lotteryNumber == myLotteryNumber{
        fmt.Println("環遊世界")  // 上述條件成立,故執行這句程式碼
    } else {
        fmt.Println("繼續努力上班吧QQ")  // 其他,執行這句程式碼
    }
}

範例 2(執行結果):

環遊世界

else if 敘述

像上面的例子,不是中頭獎就是沒中獎(不是 true 就是 false),但很多時候,我們要判定的不只有兩種情形,舉個例子:「如果我中樂透頭獎,我就要環遊世界!; 如果我中樂透二獎,我就要買房子!; 如果沒有中樂透,我就繼續努力上班吧QQ」,這個時候就是 else if 出場的時機,且 else if 可以有很多個。

if <true的運算式> {
    <執行的程式碼>
} else if <true的運算式> {
    <執行的程式碼>
} else if <true的運算式> {
    <執行的程式碼>
... // 可以有很多個 else if
} else {
    <執行的程式碼>
}

範例 3:

package main

import "fmt"

const lotteryNumber int = 4516282935
const SecondPrizeNumber int = 4516282934 // 這邊為了簡易 Demo 所以直接訂一個二獎的數字

func main(){
    myLotteryNumber := 4516282935

    if lotteryNumber == myLotteryNumber{
        fmt.Println("環遊世界") 
    } else if SecondPrizeNumber == myLotteryNumber{
        fmt.Println("買房子!") 
    } else {
        fmt.Println("繼續努力上班吧QQ")
    }
}

範例 3(執行結果):

環遊世界

補充:
if...else if...else 裡面執行的程式碼,並不會同一時間都執行,若是 if 成立,後面的 else if 跟 else 的程式碼都是不會執行的。想想上面的例子,假如說你只有一張彩卷,你不可能同時中獎又不中獎沒錯吧?!

if 敘述的起始賦值

有時候我們會呼叫某個 function ,拿這個 function 的回傳值來判定他是否正確執行,但判定完成之後這個傳回來的變數就不會用到了,但因為變數還存在他的 scope 裡,所以等於多佔了一個記憶體位置,為了避免佔用記憶體,我們可以使用起始賦值敘述 (init statement) ,讓變數作用範圍只在 if 敘述內有效,離開 if 敘述的 scope ,變數就會消滅。

if <起始賦值敘述>; <true的運算式> {
    <執行的程式碼>
}

補充:
true 的運算式內可以使用起始賦值敘述的變數來判斷

起始賦值敘述可用的簡單敘述

  1. 變數賦值和短變數賦值,如:i := 0
  2. 算術或邏輯運算式,如: i := (j+3) == 5
  3. 遞增或遞減,如: i++
  4. 在並行運算傳值給通道的敘述(之後章節會有詳細的介紹)

補充:
起始賦值敘述只允許用短變數宣告,不允許用 var 定義變數!

接下來我們在剛剛的範例加一些驗證來實作 if 敘述的起始賦值,驗證如下:

  1. 我的彩卷號碼不能為 5 的倍數
  2. 我的彩卷號碼須小於等於 9999999999
  3. 我的彩卷號碼須大於等於 1000000000

範例 4:

package main

import (
	"errors"
	"fmt"
)

const lotteryNumber int = 4516282935
const SecondPrizeNumber int = 4516282934 // 這邊為了簡易 Demo 所以直接訂一個二獎的數字

func validate(myLotteryNumber int) error { // 會回傳 error 值的檢查式
    if myLotteryNumber%5 == 0 {
        return errors.New("我的彩卷號碼不能為 5 的倍數")
    } else if myLotteryNumber>9999999999{
        return errors.New("我的彩卷號碼須小於等於 9999999999")
    } else if myLotteryNumber<1000000000{
        return errors.New("我的彩卷號碼須大於等於 1000000000")
    } else {
        return nil // 檢查通過,回傳 nil
    }

}

func main(){
    myLotteryNumber := 4516282935

    if err := validate(myLotteryNumber); err != nil{
        fmt.Println(err) // 若有錯誤印出錯誤訊息
    } else if lotteryNumber==myLotteryNumber{
        fmt.Println("環遊世界") 
    } else if SecondPrizeNumber==myLotteryNumber{
        fmt.Println("買房子!") 
    } else {
        fmt.Println("繼續努力上班吧QQ")
    }
}

範例 4(執行結果):

我的彩卷號碼不能為 5 的倍數

在範例中我們在 function main 用起始賦值定義 err 這個變數,而在 if...else 敘述跑完後, err 變數就可以功成身退,接下來就會被 Go 的記憶體管理系統回收。

今天介紹了在 Go 語言中的 if ... else 敘述條件判斷,雖然 if ... else 跟英文很像所以寫起來很直觀,但有時候又覺得其實有些攏長與囉唆,所以明天要教大家另外一種寫起來更簡潔乾淨的 switch 敘述條件判斷,那我們明天見!


上一篇
DAY 7 Go 語言 常數 (constants) 、列舉 (enums) 與變數作用範圍 (scope)
下一篇
DAY 9 Go 語言 條件判斷 - switch 敘述
系列文
跟著 Go 實戰聖經 一起自學 Go30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言